home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / games / mdlv13.zip / MDLSRC.ZIP / MDL_IO.CC < prev    next >
C/C++ Source or Header  |  1996-07-11  |  10KB  |  327 lines

  1. //
  2. // this file by brian martin 1996
  3. // brian@phyast.pitt.edu
  4. //
  5. // this is part of the source for the MedDLe quake model viewer/editor
  6. //
  7. //
  8. #include "mdl.h"
  9.  
  10. // NOTE: the unknowns here may be now found out by looking at some of
  11. // carmack's utilities source
  12. // ALSO: This doesn't read flame mld's yet
  13.  
  14. void read_mdl(FILE *in, MDL_FILE *m)
  15. {
  16.     int i,j,k;
  17.  
  18.     fread(&mdl.filetype,4,1,in);
  19.     fread(&mdl.version,4,1,in);
  20.     fread(&mdl.xscale,4,1,in);
  21.     fread(&mdl.yscale,4,1,in);
  22.     fread(&mdl.zscale,4,1,in);
  23.     fread(&mdl.xoffset,4,1,in);
  24.     fread(&mdl.yoffset,4,1,in);
  25.     fread(&mdl.zoffset,4,1,in);
  26.     fread(&mdl.radius,4,1,in);
  27.     fread(&mdl.f1,4,1,in);
  28.     fread(&mdl.f2,4,1,in);
  29.     fread(&mdl.f3,4,1,in);
  30.     fread(&mdl.num_items,4,1,in);
  31.     fread(&mdl.bitmapw,4,1,in);
  32.     fread(&mdl.bitmaph,4,1,in);
  33.     fread(&mdl.num_vertices,4,1,in);
  34.     fread(&mdl.num_triangles,4,1,in);
  35.     fread(&mdl.num_frames,1,4,in);
  36.     fread(&mdl.blank,1,4,in);
  37.     printf("v:%d t:%d f:%d b:%d\n",mdl.num_vertices,mdl.num_triangles,mdl.num_frames,mdl.blank);
  38.     fread(&mdl.unkn1,4,1,in);
  39.     fread(&mdl.unkn2,4,1,in);
  40.     printf("reading bitmap\n");
  41.     mdl.bitmap = new (unsigned char)[mdl.bitmapw*mdl.bitmaph*mdl.num_items];
  42.  
  43.     for(k=0;k<mdl.num_items;k++)
  44.     {
  45.         fseek(in,4,SEEK_CUR);
  46.  
  47.         for(j=0;j<mdl.bitmaph;j++)
  48.         {
  49.             for(i=0;i<mdl.bitmapw;i++)
  50.             {
  51.                 fread(mdl.bitmap+(i+mdl.bitmapw*(j+k*mdl.bitmaph)),1,1,in);
  52.             }
  53.         }
  54.     }
  55.  
  56.     mdl.vertex = new (unsigned)[mdl.num_vertices*3];
  57.  
  58.     for(i=0;i<mdl.num_vertices;i++)
  59.     {
  60.         fread(mdl.vertex+i*3,4,1,in);
  61.         fread(mdl.vertex+i*3+1,4,1,in);
  62.         fread(mdl.vertex+i*3+2,4,1,in);
  63.     }
  64.     mdl.triangle = new (unsigned)[mdl.num_triangles*4];
  65.  
  66.     for(i=0;i<mdl.num_triangles;i++)
  67.     {
  68.         fread(mdl.triangle+i*4,4,1,in);
  69.         fread(mdl.triangle+i*4+1,4,1,in);
  70.         fread(mdl.triangle+i*4+2,4,1,in);
  71.         fread(mdl.triangle+i*4+3,4,1,in);
  72.  
  73.     }
  74.     mdl.frame = new (struct vframe)[mdl.num_frames];
  75.     printf("reading frame data...\n");
  76. // note:: this section does not 100% correctly work yet, wait till next version
  77.     fread(&mdl.frame[0].atype,4,1,in);
  78.     if(mdl.frame[0].atype!=0)
  79.         {
  80.             fread(&mdl.frame[0].anims,4,1,in);
  81.             printf("anims %d \n",mdl.frame[j].anims);
  82.             fread(&mdl.frame[0].n1,4,1,in);
  83.             printf("n1 %d \n",mdl.frame[j].n1);
  84.             fread(&mdl.frame[0].n2,4,1,in);
  85.             printf("n2 %d \n",mdl.frame[j].n2);
  86.             mdl.frame[0].n3=new (unsigned char)[mdl.frame[0].anims*4];
  87.             for(i=0;i<mdl.num_vertices;i++)
  88.             {
  89.                 fread(mdl.frame[0].n3+i*4  ,1,1,in);
  90.                 fread(mdl.frame[0].n3+i*4+1,1,1,in);
  91.                 fread(mdl.frame[0].n3+i*4+2,1,1,in);
  92.                 fread(mdl.frame[0].n3+i*4+3,1,1,in);
  93.  
  94.             }
  95.  
  96.         fread(&mdl.frame[0].atype,4,1,in);
  97.         }
  98.  
  99.     for(j=0; j<mdl.num_frames;  j++)
  100.     {
  101.         //fread(type,4,1,in);
  102.         if(j!=0) fread(&mdl.frame[j].atype,4,1,in);
  103. //        printf("type %d \n",mdl.frame[j].atype);
  104.         fread(mdl.frame[j].minbound,1,3,in);
  105.         fread(&mdl.frame[j].unknown1,1,1,in);
  106.         fread(mdl.frame[j].maxbound,1,3,in);
  107.         fread(&mdl.frame[j].unknown2,1,1,in);
  108.         fread(&mdl.frame[j].name,16,1,in);
  109.         mdl.frame[j].v = new (unsigned char)[mdl.num_vertices*4];
  110.         for(i=0;i<mdl.num_vertices;i++)
  111.         {
  112.             fread(mdl.frame[j].v+i*4  ,1,1,in);
  113.             fread(mdl.frame[j].v+i*4+1,1,1,in);
  114.             fread(mdl.frame[j].v+i*4+2,1,1,in);
  115.             fread(mdl.frame[j].v+i*4+3,1,1,in);
  116.         }
  117.  
  118.     }
  119. //    getch();
  120.  
  121. }
  122.  
  123.  
  124.  
  125. void write_mdl(FILE *out, MDL_FILE *m)
  126. {
  127.     unsigned i,j,k;
  128.     unsigned empty=0;
  129.  
  130.     fwrite(mdl.filetype,4,1,out);
  131.     fwrite(&mdl.version,4,1,out);
  132.     fwrite(&mdl.xscale,4,1,out);
  133.     fwrite(&mdl.yscale,4,1,out);
  134.     fwrite(&mdl.zscale,4,1,out);
  135.     fwrite(&mdl.xoffset,4,1,out);
  136.     fwrite(&mdl.yoffset,4,1,out);
  137.     fwrite(&mdl.zoffset,4,1,out);
  138.     fwrite(&mdl.radius,4,1,out);
  139.     fwrite(&mdl.f1,4,1,out);
  140.     fwrite(&mdl.f2,4,1,out);
  141.     fwrite(&mdl.f3,4,1,out);
  142.  
  143.     fwrite(&mdl.num_items,4,1,out);
  144.     fwrite(&mdl.bitmapw,4,1,out);
  145.     fwrite(&mdl.bitmaph,4,1,out);
  146.     fwrite(&mdl.num_vertices,4,1,out);
  147.     fwrite(&mdl.num_triangles,4,1,out);
  148.     fwrite(&mdl.num_frames,4,1,out);
  149.     fwrite(&mdl.blank,4,1,out);
  150.     fwrite(&mdl.unkn1,4,1,out);
  151.     fwrite(&mdl.unkn2,4,1,out);
  152.  
  153.     for(k=0;k<mdl.num_items;k++)
  154.     {
  155.         fputc(0,out);
  156.         fputc(0,out);
  157.         fputc(0,out);
  158.         fputc(0,out);
  159.  
  160.         for(j=0;j<mdl.bitmaph;j++)
  161.         {
  162.             for(i=0;i<mdl.bitmapw;i++)
  163.             {
  164.                 fputc(mdl.bitmap[(i+mdl.bitmapw*(j+k*mdl.bitmaph))],out);
  165.             }
  166.         }
  167.     }
  168.  
  169.  
  170.     for(i=0;i<mdl.num_vertices;i++)
  171.     {
  172.         fwrite(mdl.vertex+i*3L,4,1,out);
  173.         fwrite(mdl.vertex+i*3L+1L,4,1,out);
  174.         fwrite(mdl.vertex+i*3L+2L,4,1,out);
  175.  
  176.     }
  177.  
  178.     for(i=0;i<mdl.num_triangles;i++)
  179.     {
  180.         fwrite(mdl.triangle+i*4L,4,1,out);
  181.         fwrite(mdl.triangle+i*4L+1L,4,1,out);
  182.         fwrite(mdl.triangle+i*4L+2L,4,1,out);
  183.         fwrite(mdl.triangle+i*4L+3L,4,1,out);
  184.     }
  185.  
  186.  
  187.     for(j=0; j<mdl.num_frames;  j++)
  188.     {
  189.  
  190.         fwrite(&mdl.frame[j].atype,4,1,out);
  191.         if(mdl.frame[j].atype!=0)
  192.         {
  193.             fwrite(&mdl.frame[j].anims,4,1,out);
  194.             fwrite(&mdl.frame[j].n1,4,1,out);
  195.             fwrite(&mdl.frame[j].n2,4,1,out);
  196.             for(i=0;i<mdl.num_vertices;i++)
  197.             {
  198.                 fwrite(mdl.frame[j].n3+i*4  ,1,1,out);
  199.                 fwrite(mdl.frame[j].n3+i*4+1,1,1,out);
  200.                 fwrite(mdl.frame[j].n3+i*4+2,1,1,out);
  201.                 fwrite(mdl.frame[j].n3+i*4+3,1,1,out);
  202.  
  203.             }
  204.         }
  205.         fwrite(mdl.frame[j].minbound,1,3,out);
  206.         fwrite(&mdl.frame[j].unknown1,1,1,out);
  207.         fwrite(mdl.frame[j].maxbound,1,3,out);
  208.         fwrite(&mdl.frame[j].unknown2,1,1,out);
  209.         fwrite(mdl.frame[j].name,16,1,out);
  210.         for(i=0;i<mdl.num_vertices;i++)
  211.         {
  212.             fwrite(mdl.frame[j].v+i*4,1,1,out);
  213.             fwrite(mdl.frame[j].v+i*4+1,1,1,out);
  214.             fwrite(mdl.frame[j].v+i*4+2,1,1,out);
  215.             fwrite(mdl.frame[j].v+i*4+3,1,1,out);
  216.         }
  217.     }
  218.  
  219. }
  220.  
  221. // this routine puts quake data into a format that I like for my
  222. // matrix routines
  223.  
  224. void setup_3d_data(MDL_FILE *m)
  225. {
  226.     int blocks;
  227.     int i,j,k;
  228.     BG_3pt vect1, vect2;
  229.     int maxn;
  230.     // block is like a cube. a single object.
  231.     // since each mdl frame is a single object, it is a block
  232.     blocks=mdl.num_frames;
  233.  
  234.     block= new (BG_Block)[blocks];
  235.     if(block==NULL) exit(1);
  236.  
  237.     for(i=0; i<blocks; i++)
  238.     {
  239.         block[i].num_pts=mdl.num_vertices;
  240.         block[i].ptlist=new (BG_3pt)[block[i].num_pts+8];
  241.         block[i].nindex=new (unsigned char)[block[i].num_pts];
  242.         if(block[i].ptlist==NULL) exit(1);
  243.         maxn=0;
  244.         // read all points
  245.         for(j=0;j<block[i].num_pts;j++)
  246.         {
  247.             block[i].ptlist[j].x=mdl.xscale*(mdl.frame[i].v[j*4])+mdl.xoffset;//+mdl.f1;//+mdl.f1)+mdl.xoffset;
  248.             block[i].ptlist[j].y=mdl.yscale*(mdl.frame[i].v[j*4+1])+mdl.yoffset;//+mdl.f2;//+mdl.f2)+mdl.yoffset;
  249.             block[i].ptlist[j].z=mdl.zscale*(mdl.frame[i].v[j*4+2])+mdl.zoffset;//+mdl.f3;//+mdl.f3)+mdl.zoffset;
  250.             block[i].nindex[j]=mdl.frame[i].v[j*4+3];
  251.         }
  252.         block[i].ptlist[block[i].num_pts].x= mdl.xscale*mdl.frame[i].minbound[0]+mdl.xoffset;
  253.         block[i].ptlist[block[i].num_pts].y= mdl.yscale*mdl.frame[i].minbound[1]+mdl.yoffset;
  254.         block[i].ptlist[block[i].num_pts].z= mdl.zscale*mdl.frame[i].minbound[2]+mdl.zoffset;
  255.  
  256.         block[i].ptlist[block[i].num_pts+1].x= mdl.xscale*mdl.frame[i].maxbound[0]+mdl.xoffset;
  257.         block[i].ptlist[block[i].num_pts+1].y= mdl.yscale*mdl.frame[i].maxbound[1]+mdl.yoffset;
  258.         block[i].ptlist[block[i].num_pts+1].z= mdl.zscale*mdl.frame[i].maxbound[2]+mdl.zoffset;
  259.  
  260.         block[i].ptlist[block[i].num_pts+2].x= mdl.xscale*mdl.frame[i].minbound[0]+mdl.xoffset;
  261.         block[i].ptlist[block[i].num_pts+2].y= mdl.yscale*mdl.frame[i].minbound[1]+mdl.yoffset;
  262.         block[i].ptlist[block[i].num_pts+2].z= mdl.zscale*mdl.frame[i].maxbound[2]+mdl.zoffset;
  263.  
  264.         block[i].ptlist[block[i].num_pts+3].x= mdl.xscale*mdl.frame[i].minbound[0]+mdl.xoffset;
  265.         block[i].ptlist[block[i].num_pts+3].y= mdl.yscale*mdl.frame[i].maxbound[1]+mdl.yoffset;
  266.         block[i].ptlist[block[i].num_pts+3].z= mdl.zscale*mdl.frame[i].minbound[2]+mdl.zoffset;
  267.  
  268.         block[i].ptlist[block[i].num_pts+4].x= mdl.xscale*mdl.frame[i].minbound[0]+mdl.xoffset;
  269.         block[i].ptlist[block[i].num_pts+4].y= mdl.yscale*mdl.frame[i].maxbound[1]+mdl.yoffset;
  270.         block[i].ptlist[block[i].num_pts+4].z= mdl.zscale*mdl.frame[i].maxbound[2]+mdl.zoffset;
  271.  
  272.         block[i].ptlist[block[i].num_pts+5].x= mdl.xscale*mdl.frame[i].maxbound[0]+mdl.xoffset;
  273.         block[i].ptlist[block[i].num_pts+5].y= mdl.yscale*mdl.frame[i].minbound[1]+mdl.yoffset;
  274.         block[i].ptlist[b